package `02-lambda_inside_function`

/**
 * apply 函数，返回的永远是调用者本身，apply中 this = 调用者
 * 链式调用，对调用者本身进行一些列顺序操作。
 */
fun main() {
    //官方提供的apply方法
    arrayListOf("111","222","333").apply {
        println(size)
    }.apply {
        this.forEachIndexed { index, s ->
            println("第$index 个元素是 $s")
        }
        println()
    }.apply {
        this += "444"
    }.apply {
        this.forEachIndexed { index, s ->
            println("第$index 个元素是 $s")
        }
    }

    //自定义myApply
    println()
    println("自定义myApply的调用")

    arrayListOf("111","222","333").myApply {
        println(size)
    }.myApply {
        this.forEachIndexed { index, s ->
            println("第$index 个元素是 $s")
        }
        println()
    }.myApply {
        this += "444"
    }.myApply {
        this.forEachIndexed { index, s ->
            println("第$index 个元素是 $s")
        }
    }

}

/**
 * 自定义myApply函数实现apply方法的效果
 * inline 对lambda进行内部优化
 * T.myApply 对T类（所有类）添加扩展函数myApply
 * T.() 对T类（所有类）添加匿名扩展函数
 */

public  inline  fun <T> T.myApply(action:T.()->Unit):T {
    action()
    return this
}


public inline fun <T,R> T.myLet(action:(T)->R):R{
    return action(this)
}